/*
 *
 * SeccionDAL.java
 * Copyright(c) 2013 UcentralSoft, Todos los derechos reservados 
 */
package controlador;

import modelo.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Maneja el acceso a los datos de secciones del sistema
 *
 * @version 1.0 [2013/10/13]
 * @author Jorge Barrera
 */
public class SeccionDAL {

    /**
     * Instancia del acceso a datos
     */
    public IDAL dataAcces;

    /**
     * Constructor de la clase
     *
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public SeccionDAL() throws ClassNotFoundException, SQLException {
        dataAcces = DALFactory.DALFactoryMethod(DBServer.MySQl);
    }

    /**
     * Permite obtener el seccion por id
     *
     * @param id
     * @return Seccion
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public Seccion ConsultarSeccionPorId(int id) throws ClassNotFoundException, SQLException {
        Seccion seccion = new Seccion();
        ResultSet dataSet = dataAcces.getData("SELECT id, idcurso, descripcion, maxcupos, idprofesor, activo FROM seccion WHERE id = '" + id + "' AND activo");
        while (dataSet.next()) {
            seccion.setId(dataAcces.getResultSet().getInt(1));
            seccion.setIdCurso(dataAcces.getResultSet().getInt(2));
            seccion.setDescripcion(dataAcces.getResultSet().getString(3));
            seccion.setMaxCupos(dataAcces.getResultSet().getInt(4));
            seccion.setIdProfesor(dataAcces.getResultSet().getInt(5));
            seccion.setActivo(dataAcces.getResultSet().getBoolean(6));
        }
        return seccion;
    }

    /**
     * Permite obetener todos los seccions
     *
     * @return List<Seccion>
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public List<Seccion> ConsultarSecciones() throws ClassNotFoundException, SQLException {
        List<Seccion> users = new Vector<Seccion>();
        ResultSet dataSet = dataAcces.getData("SELECT id, idcurso, descripcion, maxcupos, idprofesor, activo FROM seccion WHERE activo");
        while (dataSet.next()) {
            Seccion seccion = new Seccion();
            seccion.setId(dataAcces.getResultSet().getInt(1));
            seccion.setIdCurso(dataAcces.getResultSet().getInt(2));
            seccion.setDescripcion(dataAcces.getResultSet().getString(3));
            seccion.setMaxCupos(dataAcces.getResultSet().getInt(4));
            seccion.setIdProfesor(dataAcces.getResultSet().getInt(5));
            seccion.setActivo(dataAcces.getResultSet().getBoolean(6));
            users.add(seccion);
        }
        return users;
    }

    /**
     * Permite registrar un nuevo seccion
     *
     * @param seccion
     * @return boolean
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public boolean CrearSeccion(Seccion seccion) throws ClassNotFoundException, SQLException {
        return dataAcces.setData("INSERT INTO seccion(idcurso, descripcion, maxcupos, idprofesor, activo) VALUES (" + seccion.getIdCurso() + ", '" + seccion.getDescripcion() + "', " + seccion.getMaxCupos() + ", " + seccion.getIdProfesor() + ", " + seccion.getActivo() + "); ")
                && dataAcces.setData("INSERT INTO ucentralsoft.horario_seccion(IdSeccion, DiaSemana, HoraInicio, HoraFin, Salon) VALUES ((SELECT max(id) FROM seccion), 1, '00:00', '00:00', ''), ((SELECT max(id) FROM seccion), 2, '00:00', '00:00', ''), ((SELECT max(id) FROM seccion), 3, '00:00', '00:00', ''), ((SELECT max(id) FROM seccion), 4, '00:00', '00:00', ''), ((SELECT max(id) FROM seccion), 5, '00:00', '00:00', ''), ((SELECT max(id) FROM seccion), 6, '00:00', '00:00', '');");


    }

    /**
     * Permite actualizar un seccion por id del mismo
     *
     * @param seccion
     * @return boolean
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public boolean ActualizarSeccionPorId(Seccion seccion) throws ClassNotFoundException, SQLException {
        return dataAcces.setData("UPDATE seccion SET id = '" + seccion.getId() + "', idcurso = '" + seccion.getIdCurso() + "', descripcion = '" + seccion.getDescripcion() + "', maxcupos = '" + seccion.getMaxCupos() + "', idprofesor = '" + seccion.getIdProfesor() + "', activo = " + seccion.getActivo() + " WHERE id = '" + seccion.getId() + "'");
    }

    /**
     * Permite consultar los horario de una sección
     *
     * @param idSeccion
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public List<HorarioSeccion> ConsultarHorariosSeccion(int idSeccion) throws ClassNotFoundException, SQLException {
        List<HorarioSeccion> horarioSeccion = new Vector<HorarioSeccion>();
        ResultSet dataSet = dataAcces.getData("SELECT Id, IdSeccion, DiaSemana, HoraInicio, HoraFin, Salon FROM ucentralsoft.horario_seccion WHERE IdSeccion = " + idSeccion + " ");
        while (dataSet.next()) {
            HorarioSeccion horario = new HorarioSeccion();
            horario.setId(dataAcces.getResultSet().getInt(1));
            horario.setIdSeccion(dataAcces.getResultSet().getInt(2));
            horario.setDiaSemana(dataAcces.getResultSet().getInt(3));
            horario.setHoraInicio(dataAcces.getResultSet().getTime(4));
            horario.setHoraFin(dataAcces.getResultSet().getTime(5));
            horario.setSalon(dataAcces.getResultSet().getString(6));
            horarioSeccion.add(horario);
        }
        return horarioSeccion;
    }

    /**
     * Permite colocar horario a las secciones
     *
     * @param horario
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public boolean CrearHorarioSeccion(HorarioSeccion horario) throws ClassNotFoundException, SQLException {
        return dataAcces.setData("INSERT INTO ucentralsoft.horario_seccion (IdSeccion, DiaSemana, HoraInicio, HoraFin, Salon) VALUES (" + horario.getIdSeccion() + ", " + horario.getDiaSemana() + ", '" + horario.getHoraInicio() + "', '" + horario.getHoraFin() + "', '" + horario.getSalon() + "');");
    }

    /**
     * Actualiza el horario de una seccion
     *
     * @param horario
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public boolean ActualizarHorarioSeccion(HorarioSeccion horario) throws ClassNotFoundException, SQLException {
        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
        String sql = "UPDATE ucentralsoft.horario_seccion SET DiaSemana = " + horario.getDiaSemana() + ", HoraInicio = '" + formatter.format(horario.getHoraInicio()) + "', HoraFin = '" + formatter.format(horario.getHoraFin()) + "', Salon = '" + horario.getSalon() + "' WHERE DiaSemana = '" + horario.getDiaSemana() + "' AND IdSeccion = '" + horario.getIdSeccion() + "';";
        return dataAcces.setData(sql);
    }

    /**
     * Permite obetener todos los secciones para inscripcion
     *
     * @return List<Seccion>
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public List<Seccion> ConsultarSeccionesInscripcion(int idUsuario) throws ClassNotFoundException, SQLException {
        List<Seccion> secciones = new Vector<Seccion>();
        ResultSet dataSet = dataAcces.getData("SELECT seccion.Id, concat('<img title=\\\"Ver Horario\\\" src=\\\"Images/select_all.gif\\\" onclick=\\\"alert(\\'' , group_concat(CASE WHEN horario_seccion.DiaSemana = 1 THEN 'Lunes ' WHEN horario_seccion.DiaSemana = 2 THEN 'Martes ' WHEN horario_seccion.DiaSemana = 3 THEN 'Miércoles ' WHEN horario_seccion.DiaSemana = 4 THEN 'Jueves ' WHEN horario_seccion.DiaSemana = 5 THEN 'Viernes ' WHEN horario_seccion.DiaSemana = 6 THEN 'Sábado ' END, horario_seccion.HoraInicio, ' - ', horario_seccion.HoraFin SEPARATOR '\\\\n') , '\\');\\\" /> ', 'Curso [', curso.Descripcion, '] grupo [', seccion.Descripcion, '] profesor [', usuario.Nombres, ' ', usuario.Apellidos, '] cupos [', seccion.MaxCupos-count(DISTINCT inscripciones.id), ']'), ((seccion.MaxCupos - count(DISTINCT inscripciones.id)) > 0 and (select count(*) from inscripcion ins inner join seccion seccionIns ON seccionIns.Id = ins.IdSeccion where seccionIns.IdCurso = curso.id and ins.IdEstudiante = " + idUsuario + ")=0) FROM curso INNER JOIN seccion ON curso.Id = seccion.IdCurso INNER JOIN usuario ON usuario.Id = seccion.IdProfesor INNER JOIN horario_seccion ON seccion.Id = horario_seccion.IdSeccion LEFT JOIN inscripcion inscripciones ON inscripciones.IdSeccion = seccion.Id WHERE curso.Activo AND seccion.Activo AND horario_seccion.HoraInicio > '00:00:00' GROUP BY seccion.id ORDER BY curso.Id, seccion.Id, horario_seccion.DiaSemana");
        while (dataSet.next()) {
            Seccion seccion = new Seccion();
            seccion.setId(dataAcces.getResultSet().getInt(1));
            seccion.setDescripcion(dataAcces.getResultSet().getString(2));
            seccion.setMaxCupos(dataAcces.getResultSet().getInt(3));
            secciones.add(seccion);
        }
        return secciones;
    }

    /**
     * Permite realiazar la inscripcion a una seccion
     *
     * @param id
     * @param parseInt
     * @return
     */
    public boolean CrearInscripcion(int idSeccion, int idUsuario) throws SQLException, ClassNotFoundException {
        return dataAcces.setData("INSERT INTO ucentralsoft.inscripcion (IdSeccion, IdEstudiante) VALUES (" + idSeccion + ", " + idUsuario + ");");
    }
}